﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace BDSim
{
    class IonTEC
    {
        ///函数名称：CalIon_init
        ///函数功能：电离层计算初始化函数，根据所输入的UTC时间转化成年积日，判断需要读取的文件，并调用读文件函数读取文件
        ///输入：(1)Ion_Time，UTCTime形式，需要计算的UTC时间,年月日时分秒都需要赋值
        ///      (2)Iion,模型选择开关，0表示不计算电离层，1表示15阶球谐模型，2表示全球格网模型
        ///输出：无
        ///返回值：int型，-9999表示文件不存在，1表示读取文件成功,0表示选择的模型不存在
        //其他说明：所有模型都需要准备模型参数，参数文件夹应方法程序根目录下，模型与文件夹的对应关系为：1——15SPH；2——CODG；3——SH；4——SCHA；5——TSF；6--POLY；
        /////////   5和6的文件可从"ftp://ftp.unibe.ch/aiub/CODE/ "下载，文件需每天更新，请确保文件名格式及内容格式一致,推荐用模型1；
        [DllImport("IonVTECDLL.dll", EntryPoint = "CalIon_init", CallingConvention = CallingConvention.Cdecl)]
        public static extern int CalIon_init(UTCTime Ion_Time, int Iion);

        ///函数名称：CalIon_output
        ///函数功能：电离层计算函数，完成电离层延迟的计算，根据高阶模型计算，精度较高，一般用于观测值仿真
        ///输入：(1)pCalIon_Input，CalIon_Input结构体，包含卫星位置和地面站位置
        ///      (2)Iion,模型选择开关，0表示不计算电离层，1表示15阶球谐模型，2表示全球格网模型
        ///      (3)Freq,信号频率，单位为GHz
        ///      (4)IonDelay，输入不用赋值
        ///输出： IonDelay,电离层延迟值，单位为米
        ///返回值：int型，1表示计算成功,返回0表示模型选择错误，-1表示参数输入不合理（卫星位置、地面站位置、频率）,-2表示没有调用初始化函数或者调用不正确，-3表示初始化时间与计算时间不在同一天
        //约束条件：先调用初始化函数CalIon_init且其返回值为1，方可调用本函数，且输入的模型开关应一致；同一个程序中调用多次本函数，如果计算时间是同一天，只需要调用一次CalIon_init
        [DllImport("IonVTECDLL.dll", EntryPoint = "CalIon_output", CallingConvention = CallingConvention.Cdecl)]
        public static extern int CalIon_output(CalIon_Input pCalIon_Input, int Iion, out CalIon_Output Output);

        ///////////////////////////////////////////////////////////////////////////////////////////
        ///函数功能：根据经纬度及时间求格网点的VTEC
        ///输入:
        ///(1)IonGridData *GridData,电离层格网数据结构体,其中Time的年月日时分秒，经纬度必须赋值,经纬度单位为度，由于格网文件的范围问题，纬度的绝对值不能大于87.5度
        ///(2)int Iion，1为15阶球谐模型，2为格网插值模型
        ///输出:IonGridData *GridData,电离层格网数据结构体，其中VTEC为计算得到的值
        ///返回值:int 型，0表示输入出界，1表示计算成功,-9999表示没有调用初始化函数或者初始化函数调用不正确,-1表示计算时间不在所读取的系数文件时间之内
        ///约束条件：需先调用CalIon_init(UTCTime Ion_Time,int Iion)，并且Iion必须与初始化时相同
        ///////////////////////////////////////////////////////////////////////////////////////////
        [DllImport("IonVTECDLL.dll", EntryPoint = "CalGirdIonTEC", CallingConvention = CallingConvention.Cdecl)]
        public static extern int CalGirdIonTEC(out IonGridData GridData, int Iion);

        ///////////////////////////////////////////////////////////////////////////////////////////
        //函数功能：电离层计算的结束函数，用于释放内存空间
        //输入:
        //       (1)int Iion,1为15阶球谐模型，2为格网插值模型
        //输出: 无
        //返回值:无
        //其他说明：此函数只能在调用了计算函数CalIon_output或者CalGirdIonTEC之后才能调用
        [DllImport("IonVTECDLL.dll", EntryPoint = "CalIon_End", CallingConvention = CallingConvention.Cdecl)]
        public static extern void CalIon_End(int Iion);
    }
}
